#ifndef HTTPMANAGER_H
#define HTTPMANAGER_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMap>
#include <QFile>
#include <functional>
#include <QJsonObject>

// 服务器路径
#define SERVER_BASE_URL "http://8.138.248.21:8080"

// 定义回调类型（区分网络层错误和业务层错误）
using HttpSuccess = std::function<void(const QJsonObject&)>;  // 业务成功（解析后的数据）
using HttpError = std::function<void(int, const QString&)>;   // 错误（错误码+描述）

class HttpManager : public QObject
{
    Q_OBJECT
public:
    static HttpManager* instance();  // 全局单例

    // 发送带文件的POST请求
    void postWithFile(const QString& url,
                      const QMap<QString, QString>& formData,  // 文本字段
                      const QString& fileKey,                  // 文件表单名（如"photo"）
                      const QString& filePath,                 // 文件路径
                      HttpSuccess successCb,
                      HttpError errorCb);

    // 普通POST（表单数据）
    void postForm(const QString& url,
                  const QMap<QString, QString>& formData,
                  HttpSuccess successCb,
                  HttpError errorCb);

    // 普通GET请求
    void get(const QString& url,
             const QMap<QString, QString>& params,
             HttpSuccess successCb,
             HttpError errorCb);

    // POST json数据
    void postJson(const QString& url, const QJsonObject& jsonData,
                  HttpSuccess successCb, HttpError errorCb);

private slots:
    void onReplyFinished(QNetworkReply* reply);  // 统一处理响应

private:
    explicit HttpManager(QObject *parent = nullptr);
    ~HttpManager() override;

    HttpManager(const HttpManager&) = delete;  // 禁止拷贝
    HttpManager& operator=(const HttpManager&) = delete;

    QNetworkAccessManager* m_manager;
    // 存储回调（用reply指针关联，避免生命周期问题）
    QMap<QNetworkReply*, std::pair<HttpSuccess, HttpError>> m_callbacks;
};

#endif // HTTPMANAGER_H
